A method of programming a non-volatile memory array including an array of memory cells, each memory cell including a substrate, a control gate, a charge storage element, a source region and a drain region, said array divided into a plurality of program windows, me method comprising: receiving a predetermined number of bits that are to be programmed in the array, said predetermined number of bits occurring within one of said program windows; dividing said one of said program windows into a plurality of sub-windows; determining which of the predetermined number of bits correspond to memory cells in the memory array that need to be programmed; characterized by: programming the memory cells that need to be programmed in said sub-windows simultaneously, wherein the method includes; determining whether the number of bits in respective sub-windows that correspond to memory cells that need to be programmed is greater than one half of the number of bits in the respective sub-windows, wherein bits in the sub-windows not included in the bits that correspond to memory cells that need to be programmed are the remaining bits; programming the memory cells in respective sub-windows corresponding to the remaining bits and not the bits that need to be programmed, only if it is determined that the number of bits that correspond to memory cells that need to be programmed is greater that one half of the number of bits in the sub window; and setting an indication bit in each sub-window to a predetermined logic state indicative of whether the number of bits that correspond to memory cells that need to be programmed is greater than one half of the predetermined number of bits in the sub-window. receiving a predetermined number of bits that are to be programmed in the array, said predetermined number of bits occurring within one of said program windows; dividing said one of said program windows into a plurality of sub-windows; determining which of the predetermined number of bits correspond to memory cells in the memory array that need to be programmed; characterized by: programming the memory cells that need to be programmed in said sub-windows simultaneously, wherein the method includes; determining whether the number of bits in respective sub-windows that correspond to memory cells that need to be programmed is greater than one half of the number of bits in the respective sub-windows, wherein bits in the sub-windows not included in the bits that correspond to memory cells that need to be programmed are the remaining bits; programming the memory cells in respective sub-windows corresponding to the remaining bits and not the bits that need to be programmed, only if it is determined that the number of bits that correspond to memory cells that need to be programmed is greater that one half of the number of bits in the sub window; and setting an indication bit in each sub-window to a predetermined logic state indicative of whether the number of bits that correspond to memory cells that need to be programmed is greater than one half of the predetermined number of bits in the sub-window. programming the memory cells that need to be programmed in said sub-windows simultaneously, wherein the method includes; determining whether the number of bits in respective sub-windows that correspond to memory cells that need to be programmed is greater than one half of the number of bits in the respective sub-windows, wherein bits in the sub-windows not included in the bits that correspond to memory cells that need to be programmed are the remaining bits; programming the memory cells in respective sub-windows corresponding to the remaining bits and not the bits that need to be programmed, only if it is determined that the number of bits that correspond to memory cells that need to be programmed is greater that one half of the number of bits in the sub window; and setting an indication bit in each sub-window to a predetermined logic state indicative of whether the number of bits that correspond to memory cells that need to be programmed is greater than one half of the predetermined number of bits in the sub-window.